using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DataManagementTools._Raster._RasterProperties
{
    /// <summary>
    /// <para>Get Raster Properties</para>
    /// <para>Retrieves  information from the metadata and descriptive statistics about a raster dataset.</para>
    /// <para>从有关栅格数据集的元数据和描述性统计数据中检索信息。</para>
    /// </summary>    
    [DisplayName("Get Raster Properties")]
    public class GetRasterProperties : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GetRasterProperties()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_raster">
        /// <para>Input Raster</para>
        /// <para>The raster containing the properties to retrieve.</para>
        /// <para>包含要检索的属性的栅格。</para>
        /// </param>
        public GetRasterProperties(object _in_raster)
        {
            this._in_raster = _in_raster;
        }
        public override string ToolboxName => "Data Management Tools";

        public override string ToolName => "Get Raster Properties";

        public override string CallName => "management.GetRasterProperties";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_in_raster, _property_type.GetGPValue(), _band_index, _property];

        /// <summary>
        /// <para>Input Raster</para>
        /// <para>The raster containing the properties to retrieve.</para>
        /// <para>包含要检索的属性的栅格。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_raster { get; set; }


        /// <summary>
        /// <para>Property type</para>
        /// <para><xdoc>
        ///   <para>The property to be obtained from the input raster.</para>
        ///   <bulletList>
        ///     <bullet_item>Minimum cell value—Smallest value of all cells in the input raster.</bullet_item><para/>
        ///     <bullet_item>Maximum cell value—Largest value of all cells in the input raster.</bullet_item><para/>
        ///     <bullet_item>Mean of all cells—Average of all cells in the input raster.</bullet_item><para/>
        ///     <bullet_item>Standard Deviation of all cells—Standard deviation of all cells in the input raster.</bullet_item><para/>
        ///     <bullet_item>Unique value count—Number of unique values in the input raster.</bullet_item><para/>
        ///     <bullet_item>Maximum Y coordinate (top)—Top (maximum y-coordinate) value of the extent.</bullet_item><para/>
        ///     <bullet_item>Minimum X coordinate (left)—Left (minimum x-coordinate) value of the extent.</bullet_item><para/>
        ///     <bullet_item>Maximum X coordinate (right)—Right (maximum x-coordinate) value of the extent.</bullet_item><para/>
        ///     <bullet_item>Minimum Y coordinate (bottom)—Bottom (minimum y-coordinate) value of the extent.</bullet_item><para/>
        ///     <bullet_item>Cell size x-direction—Cell size in the x-direction.</bullet_item><para/>
        ///     <bullet_item>Cell size y-direction—Cell size in the y-direction.</bullet_item><para/>
        ///     <bullet_item>Cell value type—Type of the cell value in the input raster.</bullet_item><para/>
        ///     <bullet_item>Number of columns—Number of columns in the input raster.</bullet_item><para/>
        ///     <bullet_item>Number of rows—Number of rows in the input raster.</bullet_item><para/>
        ///     <bullet_item>Number of bands—Number of bands in the input raster.</bullet_item><para/>
        ///     <bullet_item>Contains NoData cells—Returns whether there is NoData in the raster.</bullet_item><para/>
        ///     <bullet_item>All cells contain NoData—Returns whether all the pixels are NoData. This is also known as ISNULL.</bullet_item><para/>
        ///     <bullet_item>Sensor name—Name of the sensor.</bullet_item><para/>
        ///     <bullet_item>Product name—Product name related to the sensor.</bullet_item><para/>
        ///     <bullet_item>Acquisition date—Date that the data was captured.</bullet_item><para/>
        ///     <bullet_item>Source type—Source type.</bullet_item><para/>
        ///     <bullet_item>Cloud cover—Amount of cloud cover as a percentage.</bullet_item><para/>
        ///     <bullet_item>Sun azimuth—Sun azimuth, in degrees.</bullet_item><para/>
        ///     <bullet_item>Sun elevation—Sun elevation, in degrees.</bullet_item><para/>
        ///     <bullet_item>Sensor azimuth—Sensor azimuth, in degrees.</bullet_item><para/>
        ///     <bullet_item>Sensor elevation—Sensor elevation, in degrees.</bullet_item><para/>
        ///     <bullet_item>Off nadir—Off-nadir angle, in degrees.</bullet_item><para/>
        ///     <bullet_item>Wavelength—Wavelength range of the band, in nanometers.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要从输入栅格获取的属性。</para>
        ///   <bulletList>
        ///     <bullet_item>最小像元值 - 输入栅格中所有像元的最小值。</bullet_item><para/>
        ///     <bullet_item>最大像元值 - 输入栅格中所有像元的最大值。</bullet_item><para/>
        ///     <bullet_item>所有像元的平均值—输入栅格中所有像元的平均值。</bullet_item><para/>
        ///     <bullet_item>所有像元的标准差—输入栅格中所有像元的标准差。</bullet_item><para/>
        ///     <bullet_item>唯一值计数 - 输入栅格中的唯一值数。</bullet_item><para/>
        ///     <bullet_item>最大 Y 坐标（顶部）- 范围的顶部（最大 y 坐标）值。</bullet_item><para/>
        ///     <bullet_item>最小 X 坐标（左）- 范围的左（最小 x 坐标）值。</bullet_item><para/>
        ///     <bullet_item>最大 X 坐标（右）- 范围的右（最大 x 坐标）值。</bullet_item><para/>
        ///     <bullet_item>最小 Y 坐标（底部）- 范围的底部（最小 y 坐标）值。</bullet_item><para/>
        ///     <bullet_item>像元大小 x 方向 - 像元大小在 x 方向上。</bullet_item><para/>
        ///     <bullet_item>像元大小 y 方向 - y 方向的像元大小。</bullet_item><para/>
        ///     <bullet_item>像元值类型 - 输入栅格中像元值的类型。</bullet_item><para/>
        ///     <bullet_item>列数 - 输入栅格中的列数。</bullet_item><para/>
        ///     <bullet_item>行数 - 输入栅格中的行数。</bullet_item><para/>
        ///     <bullet_item>波段数 - 输入栅格中的波段数。</bullet_item><para/>
        ///     <bullet_item>包含 NoData 像元 - 返回栅格中是否存在 NoData。</bullet_item><para/>
        ///     <bullet_item>所有单元格都包含 NoData - 返回是否所有像素均为 NoData。这也称为 ISNULL。</bullet_item><para/>
        ///     <bullet_item>传感器名称 - 传感器的名称。</bullet_item><para/>
        ///     <bullet_item>产品名称 - 与传感器相关的产品名称。</bullet_item><para/>
        ///     <bullet_item>采集日期 - 捕获数据的日期。</bullet_item><para/>
        ///     <bullet_item>源类型 （Source type） - 源类型。</bullet_item><para/>
        ///     <bullet_item>云量 - 云量百分比。</bullet_item><para/>
        ///     <bullet_item>太阳方位角 - 太阳方位角，以度为单位。</bullet_item><para/>
        ///     <bullet_item>太阳高程 - 太阳高程，以度为单位。</bullet_item><para/>
        ///     <bullet_item>传感器方位角 （Sensor azimuth） - 传感器方位角，单位为度。</bullet_item><para/>
        ///     <bullet_item>传感器高程 - 传感器高程，以度为单位。</bullet_item><para/>
        ///     <bullet_item>Off nadir - 偏离最低点角度，单位为度。</bullet_item><para/>
        ///     <bullet_item>波长 - 波段的波长范围，以纳米为单位。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Property type")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _property_type_value _property_type { get; set; } = _property_type_value._MINIMUM;

        public enum _property_type_value
        {
            /// <summary>
            /// <para>Maximum cell value</para>
            /// <para>Maximum cell value—Largest value of all cells in the input raster.</para>
            /// <para>最大像元值 - 输入栅格中所有像元的最大值。</para>
            /// </summary>
            [Description("Maximum cell value")]
            [GPEnumValue("MAXIMUM")]
            _MAXIMUM,

            /// <summary>
            /// <para>Minimum cell value</para>
            /// <para>Minimum cell value—Smallest value of all cells in the input raster.</para>
            /// <para>最小像元值 - 输入栅格中所有像元的最小值。</para>
            /// </summary>
            [Description("Minimum cell value")]
            [GPEnumValue("MINIMUM")]
            _MINIMUM,

            /// <summary>
            /// <para>Mean of all cells</para>
            /// <para>Mean of all cells—Average of all cells in the input raster.</para>
            /// <para>所有像元的平均值—输入栅格中所有像元的平均值。</para>
            /// </summary>
            [Description("Mean of all cells")]
            [GPEnumValue("MEAN")]
            _MEAN,

            /// <summary>
            /// <para>Standard Deviation of all cells</para>
            /// <para>Standard Deviation of all cells—Standard deviation of all cells in the input raster.</para>
            /// <para>所有像元的标准差—输入栅格中所有像元的标准差。</para>
            /// </summary>
            [Description("Standard Deviation of all cells")]
            [GPEnumValue("STD")]
            _STD,

            /// <summary>
            /// <para>Unique value count</para>
            /// <para>Unique value count—Number of unique values in the input raster.</para>
            /// <para>唯一值计数 - 输入栅格中的唯一值数。</para>
            /// </summary>
            [Description("Unique value count")]
            [GPEnumValue("UNIQUEVALUECOUNT")]
            _UNIQUEVALUECOUNT,

            /// <summary>
            /// <para>Maximum Y coordinate (top)</para>
            /// <para>Maximum Y coordinate (top)—Top (maximum y-coordinate) value of the extent.</para>
            /// <para>最大 Y 坐标（顶部）- 范围的顶部（最大 y 坐标）值。</para>
            /// </summary>
            [Description("Maximum Y coordinate (top)")]
            [GPEnumValue("TOP")]
            _TOP,

            /// <summary>
            /// <para>Minimum X coordinate (left)</para>
            /// <para>Minimum X coordinate (left)—Left (minimum x-coordinate) value of the extent.</para>
            /// <para>最小 X 坐标（左）- 范围的左（最小 x 坐标）值。</para>
            /// </summary>
            [Description("Minimum X coordinate (left)")]
            [GPEnumValue("LEFT")]
            _LEFT,

            /// <summary>
            /// <para>Maximum X coordinate (right)</para>
            /// <para>Maximum X coordinate (right)—Right (maximum x-coordinate) value of the extent.</para>
            /// <para>最大 X 坐标（右）- 范围的右（最大 x 坐标）值。</para>
            /// </summary>
            [Description("Maximum X coordinate (right)")]
            [GPEnumValue("RIGHT")]
            _RIGHT,

            /// <summary>
            /// <para>Minimum Y coordinate (bottom)</para>
            /// <para>Minimum Y coordinate (bottom)—Bottom (minimum y-coordinate) value of the extent.</para>
            /// <para>最小 Y 坐标（底部）- 范围的底部（最小 y 坐标）值。</para>
            /// </summary>
            [Description("Minimum Y coordinate (bottom)")]
            [GPEnumValue("BOTTOM")]
            _BOTTOM,

            /// <summary>
            /// <para>Cell size x-direction</para>
            /// <para>Cell size x-direction—Cell size in the x-direction.</para>
            /// <para>像元大小 x 方向 - 像元大小在 x 方向上。</para>
            /// </summary>
            [Description("Cell size x-direction")]
            [GPEnumValue("CELLSIZEX")]
            _CELLSIZEX,

            /// <summary>
            /// <para>Cell size y-direction</para>
            /// <para>Cell size y-direction—Cell size in the y-direction.</para>
            /// <para>像元大小 y 方向 - y 方向的像元大小。</para>
            /// </summary>
            [Description("Cell size y-direction")]
            [GPEnumValue("CELLSIZEY")]
            _CELLSIZEY,

            /// <summary>
            /// <para>Cell value type</para>
            /// <para>Cell value type—Type of the cell value in the input raster.</para>
            /// <para>像元值类型 - 输入栅格中像元值的类型。</para>
            /// </summary>
            [Description("Cell value type")]
            [GPEnumValue("VALUETYPE")]
            _VALUETYPE,

            /// <summary>
            /// <para>Number of columns</para>
            /// <para>Number of columns—Number of columns in the input raster.</para>
            /// <para>列数 - 输入栅格中的列数。</para>
            /// </summary>
            [Description("Number of columns")]
            [GPEnumValue("COLUMNCOUNT")]
            _COLUMNCOUNT,

            /// <summary>
            /// <para>Number of rows</para>
            /// <para>Number of rows—Number of rows in the input raster.</para>
            /// <para>行数 - 输入栅格中的行数。</para>
            /// </summary>
            [Description("Number of rows")]
            [GPEnumValue("ROWCOUNT")]
            _ROWCOUNT,

            /// <summary>
            /// <para>Number of bands</para>
            /// <para>Number of bands—Number of bands in the input raster.</para>
            /// <para>波段数 - 输入栅格中的波段数。</para>
            /// </summary>
            [Description("Number of bands")]
            [GPEnumValue("BANDCOUNT")]
            _BANDCOUNT,

            /// <summary>
            /// <para>All cells contain NoData</para>
            /// <para>All cells contain NoData—Returns whether all the pixels are NoData. This is also known as ISNULL.</para>
            /// <para>所有单元格都包含 NoData - 返回是否所有像素均为 NoData。这也称为 ISNULL。</para>
            /// </summary>
            [Description("All cells contain NoData")]
            [GPEnumValue("ALLNODATA")]
            _ALLNODATA,

            /// <summary>
            /// <para>Contains NoData cells</para>
            /// <para>Contains NoData cells—Returns whether there is NoData in the raster.</para>
            /// <para>包含 NoData 像元 - 返回栅格中是否存在 NoData。</para>
            /// </summary>
            [Description("Contains NoData cells")]
            [GPEnumValue("ANYNODATA")]
            _ANYNODATA,

            /// <summary>
            /// <para>Sensor name</para>
            /// <para>Sensor name—Name of the sensor.</para>
            /// <para>传感器名称 - 传感器的名称。</para>
            /// </summary>
            [Description("Sensor name")]
            [GPEnumValue("SENSORNAME")]
            _SENSORNAME,

            /// <summary>
            /// <para>Product name</para>
            /// <para>Product name—Product name related to the sensor.</para>
            /// <para>产品名称 - 与传感器相关的产品名称。</para>
            /// </summary>
            [Description("Product name")]
            [GPEnumValue("PRODUCTNAME")]
            _PRODUCTNAME,

            /// <summary>
            /// <para>Acquisition date</para>
            /// <para>Acquisition date—Date that the data was captured.</para>
            /// <para>采集日期 - 捕获数据的日期。</para>
            /// </summary>
            [Description("Acquisition date")]
            [GPEnumValue("ACQUISITIONDATE")]
            _ACQUISITIONDATE,

            /// <summary>
            /// <para>Source type</para>
            /// <para>Source type—Source type.</para>
            /// <para>源类型 （Source type） - 源类型。</para>
            /// </summary>
            [Description("Source type")]
            [GPEnumValue("SOURCETYPE")]
            _SOURCETYPE,

            /// <summary>
            /// <para>Cloud cover</para>
            /// <para>Cloud cover—Amount of cloud cover as a percentage.</para>
            /// <para>云量 - 云量百分比。</para>
            /// </summary>
            [Description("Cloud cover")]
            [GPEnumValue("CLOUDCOVER")]
            _CLOUDCOVER,

            /// <summary>
            /// <para>Sun azimuth</para>
            /// <para>Sun azimuth—Sun azimuth, in degrees.</para>
            /// <para>太阳方位角 - 太阳方位角，以度为单位。</para>
            /// </summary>
            [Description("Sun azimuth")]
            [GPEnumValue("SUNAZIMUTH")]
            _SUNAZIMUTH,

            /// <summary>
            /// <para>Sun elevation</para>
            /// <para>Sun elevation—Sun elevation, in degrees.</para>
            /// <para>太阳高程 - 太阳高程，以度为单位。</para>
            /// </summary>
            [Description("Sun elevation")]
            [GPEnumValue("SUNELEVATION")]
            _SUNELEVATION,

            /// <summary>
            /// <para>Sensor azimuth</para>
            /// <para>Sensor azimuth—Sensor azimuth, in degrees.</para>
            /// <para>传感器方位角 （Sensor azimuth） - 传感器方位角，单位为度。</para>
            /// </summary>
            [Description("Sensor azimuth")]
            [GPEnumValue("SENSORAZIMUTH")]
            _SENSORAZIMUTH,

            /// <summary>
            /// <para>Sensor elevation</para>
            /// <para>Sensor elevation—Sensor elevation, in degrees.</para>
            /// <para>传感器高程 - 传感器高程，以度为单位。</para>
            /// </summary>
            [Description("Sensor elevation")]
            [GPEnumValue("SENSORELEVATION")]
            _SENSORELEVATION,

            /// <summary>
            /// <para>Off nadir</para>
            /// <para>Off nadir—Off-nadir angle, in degrees.</para>
            /// <para>Off nadir - 偏离最低点角度，单位为度。</para>
            /// </summary>
            [Description("Off nadir")]
            [GPEnumValue("OFFNADIR")]
            _OFFNADIR,

            /// <summary>
            /// <para>Wavelength</para>
            /// <para>Wavelength—Wavelength range of the band, in nanometers.</para>
            /// <para>波长 - 波段的波长范围，以纳米为单位。</para>
            /// </summary>
            [Description("Wavelength")]
            [GPEnumValue("WAVELENGTH")]
            _WAVELENGTH,

        }

        /// <summary>
        /// <para>Band Name</para>
        /// <para>Choose the band name from the drop-down box. If no band is chosen, then the first band will be used.</para>
        /// <para>从下拉框中选择乐队名称。如果未选择波段，则将使用第一个波段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Band Name")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _band_index { get; set; } = null;


        /// <summary>
        /// <para>Property</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Property")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _property { get; set; }


        public GetRasterProperties SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}